﻿using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace ExpertNewsRotator2.ExpertNewsRotator2
{
    [ToolboxItemAttribute(false)]
    public class ExpertNewsRotator2 : Microsoft.SharePoint.WebPartPages.WebPart
    {
        private string _exceptions = "";
        private AddInsEnum DE = AddInsEnum.HyperLink;
        private const AddInsEnum DefaultAddInsEnum = AddInsEnum.HyperLink;
        private const TheDateFormat DefaultDateFormat = TheDateFormat.MonthDayYear;
        private const PeriodEnum DefaultPeriod = PeriodEnum.Five;
        private const string defaultText = "Your text here";
        private const string DefaultURL = "DispForm.aspx";
        private TheDateFormat DF = TheDateFormat.MonthDayYear;
        private string endField = "Image URL";
        private const string imgTURL = "/_layouts/ExpertNewsRotator2/banner1_thumb.jpg";
        private const string imgURL = "/_layouts/ExpertNewsRotator2/banner1.jpg";
        protected Label lblError;
        private const string listText = "";
        private string listViewFields = "";
        private PeriodEnum Period = PeriodEnum.Five;
        private string sImageURL = "/_layouts/ExpertNewsRotator2/banner1.jpg";
        private string siteURLtext = "Your Site here";
        private string startField = "Body";
        private string sTImageURL = "/_layouts/ExpertNewsRotator2/banner1_thumb.jpg";
        private string sTimeField = "/_layouts/ExpertNewsRotator2/style_smaller.css";
        private string sYAxisTitle = "15";
        private string text = "Your text here";
        private string ThumbImageField = "";
        private const string timer = "/_layouts/ExpertNewsRotator2/style_smaller.css";
        private string titleField = "";
        private string urltocalendar = "DispForm.aspx";
        private const string yaxistit = "15";

        protected override void CreateChildControls()
        {
            HtmlTable table;
            
            bool controlsAdded = false;
            try
            {
                base.CreateChildControls();
                SPWeb theWeb = new SPSite(this.SiteURL).OpenWeb();
                SPSecurity.RunWithElevatedPrivileges(delegate
                {
                    using (SPSite site = new SPSite(theWeb.Url))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            SPList list = web.Lists[this.Text];
                            if (list.BaseTemplate == SPListTemplateType.Announcements)
                            {
                                this.lblError = new Label();
                                this.lblError.Text = "Error:";
                                this.lblError.Visible = true;
                                HtmlTable child = new HtmlTable();
                                HtmlTableRow row = new HtmlTableRow();
                                HtmlTableCell cell = new HtmlTableCell();
                                string str = "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + this.CSSField + "\" /><script type=\"text/javascript\" src=\"/_layouts/ExpertNewsRotator2/jquery-1.3.2.min.js\"></script><script type=\"text/javascript\">var X = jQuery.noConflict();X(document).ready(function() {\t X(\".main_image .desc\").show(); X(\".main_image .block\").animate({ opacity: 0.85 }, 1 ); X(\".image_thumb ul li:first\").addClass('active'); X(\".image_thumb ul li\").click(function(){   var imgAlt = X(this).find('img').attr(\"alt\");   var imgTitle = X(this).find('a').attr(\"href\");   var imgDesc = X(this).find('.block').html(); \t var imgDescHeight = X(\".main_image\").find('.block').height();\t\t  if (X(this).is(\".active\")) {return false;} else {X(\".main_image .block\").animate({ opacity: 0, marginBottom: -imgDescHeight }, 250 , function() { X(\".main_image .block\").html(imgDesc).animate({ opacity: 0.85,\tmarginBottom: \"0\" }, 250 ); X(\".main_image img\").attr({src: imgTitle , alt: imgAlt}); });}  X(\".image_thumb ul li\").removeClass('active'); X(this).addClass('active'); return false;}) .hover(function(){ X(this).addClass('hover'); }, function() { X(this).removeClass('hover');}); X(\"a.collapse\").click(function(){ X(\".main_image .block\").slideToggle();   X(\"a.collapse\").toggleClass(\"show\"); });}); </script><div id=\"main\" class=\"container\">";
                                string sideNav = this.GetSideNav();
                                string mainContent = this.GetMainContent();
                                cell.InnerHtml = str + mainContent + sideNav + "</div></div>";
                                row.Cells.Add(cell);
                                child.Rows.Add(row);
                                this.Controls.Add(child);
                                controlsAdded = true;
                            }
                        }
                    }
                });
            }
            catch (Exception exception)
            {
                HtmlTableRow row;
                HtmlTableCell cell;
                if (controlsAdded)
                {
                    this._exceptions = this._exceptions + "CreateChildControls_Exception: " + exception.Message;
                }
                table = new HtmlTable();
                row = new HtmlTableRow();
                cell = new HtmlTableCell();
                if (!this.Text.Contains("Your text here"))
                {
                    cell.InnerHtml = "Error: " + exception.Message;
                    row.Cells.Add(cell);
                    table.Rows.Add(row);
                    this.Controls.Add(table);
                    this.Controls.Add(this.lblError);
                }
            }
            if (!controlsAdded)
            {
                HtmlTableRow row;
                HtmlTableCell cell;
                table = new HtmlTable();
                row = new HtmlTableRow();
                cell = new HtmlTableCell();
                if (!this.Text.Contains("Your text here"))
                {
                    cell.InnerHtml = "Please choose a list of type Announcement: " + this.Text + " - Site:" + this.SiteURL;
                    row.Cells.Add(cell);
                    table.Rows.Add(row);
                    this.Controls.Add(table);
                    this.Controls.Add(this.lblError);
                }
                else
                {
                    cell.InnerHtml = "Please setup your NewsRotator by clicking Modify Shared WebPart";
                    row.Cells.Add(cell);
                    table.Rows.Add(row);
                    this.Controls.Add(table);
                }
            }
        }

        private string FirstWords(string input, int numberWords)
        {
            try
            {
                int num = numberWords;
                for (int i = 0; i < input.Length; i++)
                {
                    if (input[i] == ' ')
                    {
                        num--;
                    }
                    if (num == 0)
                    {
                        return input.Substring(0, i);
                    }
                }
            }
            catch (Exception)
            {
            }
            return string.Empty;
        }

        private string GetMainContent()
        {
            string str = "";
            this.lblError.Text = this.lblError.Text + " -> GetMainContent()";
            SPSite site = new SPSite(this.SiteURL);
            SPWeb web = site.OpenWeb();
            SPUserToken userToken = site.SystemAccount.UserToken;
            using (SPSite site2 = new SPSite(web.Url, userToken))
            {
                using (SPWeb web2 = site2.OpenWeb())
                {
                    SPView view = web2.Lists[this.Text].Views[this.ListViewFields];
                    view.RowLimit = 1;
                    SPListItemCollection items = web2.Lists[this.Text].GetItems(view);
                    int num = 0;
                    int num2 = this.getNumber(this.NumEvents.ToString());
                    string str2 = "";
                    if (items.Count > 0)
                    {
                        foreach (SPListItem item in items)
                        {
                            if (num == 0)
                            {
                                object obj2;
                                string imageURL = "";
                                string format = "";
                                if (this.DateFormat.ToString() == "DayMonthYear")
                                {
                                    format = "d/M/yyyy HH:mm";
                                }
                                else
                                {
                                    format = "M/d/yyyy HH:mm";
                                }
                                if (item[this.ImageURLField] != null)
                                {
                                    if (this.TheColumnType.ToString() != "HyperLink")
                                    {
                                        if (item[this.ImageURLField].ToString().Trim() != string.Empty)
                                        {
                                            imageURL = item[this.ImageURLField].ToString();
                                        }
                                        else
                                        {
                                            imageURL = this.ImageURL;
                                        }
                                    }
                                    else if (item[this.ImageURLField].ToString().Trim() != string.Empty)
                                    {
                                        imageURL = item[this.ImageURLField].ToString().Split(new char[] { ',' })[0];
                                    }
                                    else
                                    {
                                        imageURL = this.ImageURL;
                                    }
                                }
                                else
                                {
                                    imageURL = this.ImageURL;
                                }
                                str2 = str2 + "<div class=\"main_image\">";
                                str2 = str2 + "<img src=\"" + imageURL + "\" alt=\"banner\" />";
                                str2 = str2 + "<div class=\"desc\" ><a href=\"#\" class=\"collapse\">Close Me!</a>";
                                if (item[this.TitleField] != null)
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<div class=\"block\"><h2><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >", item[this.TitleField].ToString(), "</a></h2>" });
                                }
                                else
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<div class=\"block\"><h2><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >No Title Text Found</a></h2>" });
                                }
                                str2 = str2 + "<small>" + Convert.ToDateTime(item["Created"].ToString()).ToString(format) + "</small>";
                                if (item[this.BodyField] != null)
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<p>", this.FirstWords(this.StripTagsCharArray(item[this.BodyField].ToString()), Convert.ToInt32(this.NumWords)), "... <br/><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >read more</a></p></div></div></div>" });
                                }
                                else
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<p>", this.FirstWords(this.StripTagsCharArray("No Body Text Found"), Convert.ToInt32(this.NumWords)), "... <br/><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >read more</a></p></div></div></div>" });
                                }
                            }
                            num++;
                        }
                    }
                    str = str + str2;
                }
            }
            return str;
        }

        public int getNumber(string number)
        {
            switch (number)
            {
                case "One":
                    return 1;

                case "Two":
                    return 2;

                case "Three":
                    return 3;

                case "Four":
                    return 4;

                case "Five":
                    return 5;

                case "Six":
                    return 6;

                case "Seven":
                    return 7;

                case "Eight":
                    return 8;

                case "Nine":
                    return 9;

                case "Ten":
                    return 10;
            }
            return 0;
        }

        private string GetSideNav()
        {
            this.lblError.Text = this.lblError.Text + " -> GetSideNav()";
            string str = "<div class=\"image_thumb\"><ul>";
            SPSite site = new SPSite(this.SiteURL);
            SPWeb web = site.OpenWeb();
            SPUserToken userToken = site.SystemAccount.UserToken;
            using (SPSite site2 = new SPSite(web.Url, userToken))
            {
                using (SPWeb web2 = site2.OpenWeb())
                {
                    SPView view = web2.Lists[this.Text].Views[this.ListViewFields];
                    SPListItemCollection items = web2.Lists[this.Text].GetItems(view);
                    int num = 0;
                    int num2 = this.getNumber(this.NumEvents.ToString());
                    string str2 = "";
                    if (items.Count > 0)
                    {
                        foreach (SPListItem item in items)
                        {
                            if (num < num2)
                            {
                                object obj2;
                                string imageThumbURL = "";
                                string imageURL = "";
                                string format = "";
                                if (this.DateFormat.ToString() == "DayMonthYear")
                                {
                                    format = "d/M/yyyy HH:mm";
                                }
                                else
                                {
                                    format = "M/d/yyyy HH:mm";
                                }
                                if (item[this.ImageURLField] != null)
                                {
                                    if (this.TheColumnType.ToString() != "HyperLink")
                                    {
                                        if (item[this.ImageURLField].ToString().Trim() != string.Empty)
                                        {
                                            imageURL = item[this.ImageURLField].ToString();
                                        }
                                        else
                                        {
                                            imageURL = this.ImageURL;
                                        }
                                    }
                                    else if (item[this.ImageURLField].ToString().Trim() != string.Empty)
                                    {
                                        imageURL = item[this.ImageURLField].ToString().Split(new char[] { ',' })[0];
                                    }
                                    else
                                    {
                                        imageURL = this.ImageURL;
                                    }
                                }
                                else
                                {
                                    imageURL = this.ImageURL;
                                }
                                if (item[this.ThumbImageURLField] != null)
                                {
                                    if (this.TheColumnType.ToString() != "HyperLink")
                                    {
                                        if (item[this.ThumbImageURLField].ToString().Trim() != string.Empty)
                                        {
                                            imageThumbURL = item[this.ThumbImageURLField].ToString();
                                        }
                                        else
                                        {
                                            imageThumbURL = this.ImageThumbURL;
                                        }
                                    }
                                    else if (item[this.ThumbImageURLField].ToString().Trim() != string.Empty)
                                    {
                                        imageThumbURL = item[this.ThumbImageURLField].ToString().Split(new char[] { ',' })[0];
                                    }
                                    else
                                    {
                                        imageThumbURL = this.ImageThumbURL;
                                    }
                                }
                                else
                                {
                                    imageThumbURL = this.ImageThumbURL;
                                }
                                str2 = str2 + "<li><a href=\"" + imageURL + "\">";
                                str2 = str2 + "<img src=\"" + imageThumbURL + "\" alt=\"\" /></a>";
                                if (item[this.TitleField] != null)
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<div class=\"block\"><h2><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >", item[this.TitleField].ToString(), "</a></h2>" });
                                }
                                else
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<div class=\"block\"><h2><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >No List Title Found</a></h2>" });
                                }
                                str2 = str2 + "<small>" + Convert.ToDateTime(item["Created"].ToString()).ToString(format) + "</small>";
                                if (item[this.BodyField] != null)
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<p>", this.FirstWords(this.StripTagsCharArray(item[this.BodyField].ToString()), Convert.ToInt32(this.NumWords)), "... <br/><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >read more</a></p></div></li>" });
                                }
                                else
                                {
                                    obj2 = str2;
                                    str2 = string.Concat(new object[] { obj2, "<p>", this.FirstWords(this.StripTagsCharArray("No Body Text Found"), Convert.ToInt32(this.NumWords)), "... <br/><a href=\"", web.Url, "/Lists/", this.Text, "/DispForm.aspx?ID=", item.ID, "\" >read more</a></p></div></li>" });
                                }
                            }
                            num++;
                        }
                    }
                    str = str + str2;
                }
            }
            return (str + "</ul>");
        }

        public override ToolPart[] GetToolParts()
        {
            ToolPart[] partArray = new ToolPart[3];
            WebPartToolPart part = new WebPartToolPart();
            CustomPropertyToolPart part2 = new CustomPropertyToolPart();
            partArray[0] = part2;
            partArray[1] = part;
            partArray[2] = new CustomToolPart();
            return partArray;
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            try
            {
                base.RenderContents(writer);
            }
            catch (Exception exception)
            {
                this._exceptions = this._exceptions + "RenderContents_Exception: " + exception.Message;
            }
            finally
            {
                if (this._exceptions.Length > 0)
                {
                    writer.WriteLine(this._exceptions);
                }
            }
        }

        private string StripTagsCharArray(string source)
        {
            char[] chArray = new char[source.Length];
            int index = 0;
            bool flag = false;
            for (int i = 0; i < source.Length; i++)
            {
                char ch = source[i];
                if (ch == '<')
                {
                    flag = true;
                }
                else if (ch == '>')
                {
                    flag = false;
                }
                else if (!flag)
                {
                    chArray[index] = ch;
                    index++;
                }
            }
            return new string(chArray, 0, index);
        }

        public string BodyField
        {
            get
            {
                return this.startField;
            }
            set
            {
                this.startField = value;
            }
        }

        [WebDisplayName("Style Sheet URL"), WebDescription("Specifies the path to the css file"), SPWebCategoryName("General Settings"), Personalizable(true), WebBrowsable(true)]
        public string CSSField
        {
            get
            {
                return this.sTimeField;
            }
            set
            {
                this.sTimeField = value;
            }
        }

        [WebBrowsable(true), Personalizable(true), WebDisplayName("Date Format"), WebDescription("Date Format of your News Items"), SPWebCategoryName("General Settings")]
        public TheDateFormat DateFormat
        {
            get
            {
                return this.DF;
            }
            set
            {
                this.DF = value;
            }
        }

        [WebBrowsable(true), WebDescription("Thumb Image URL to use when no image is found"), SPWebCategoryName("General Settings"), Personalizable(true), WebDisplayName("No Thumb Image URL")]
        public string ImageThumbURL
        {
            get
            {
                return this.sTImageURL;
            }
            set
            {
                this.sTImageURL = value;
            }
        }

        [Personalizable(true), SPWebCategoryName("General Settings"), WebBrowsable(true), WebDisplayName("No Image URL"), WebDescription("Image URL to use when no image is found")]
        public string ImageURL
        {
            get
            {
                return this.sImageURL;
            }
            set
            {
                this.sImageURL = value;
            }
        }

        public string ImageURLField
        {
            get
            {
                return this.endField;
            }
            set
            {
                this.endField = value;
            }
        }

        public string ListViewFields
        {
            get
            {
                return this.listViewFields;
            }
            set
            {
                this.listViewFields = value;
            }
        }

        [WebDescription("Number of news items to show"), WebDisplayName("Number of news items to show"), WebBrowsable(true), SPWebCategoryName("General Settings"), Personalizable(true)]
        public PeriodEnum NumEvents
        {
            get
            {
                return this.Period;
            }
            set
            {
                this.Period = value;
            }
        }

        [WebDisplayName("Number of words to show from the Body"), Personalizable(true), SPWebCategoryName("General Settings"), WebDescription("Specifies the number of words to show from the body in the main webpart, under the Title"), WebBrowsable(true)]
        public string NumWords
        {
            get
            {
                return this.sYAxisTitle;
            }
            set
            {
                this.sYAxisTitle = value;
            }
        }

        public string SiteURL
        {
            get
            {
                return this.siteURLtext;
            }
            set
            {
                this.siteURLtext = value;
            }
        }

        public string Text
        {
            get
            {
                return this.text;
            }
            set
            {
                this.text = value;
            }
        }

        [Personalizable(true), SPWebCategoryName("General Settings"), WebDisplayName("Image Column Type"), WebBrowsable(true), WebDescription("If used with the uploader column (purchased) or hyperlink")]
        public AddInsEnum TheColumnType
        {
            get
            {
                return this.DE;
            }
            set
            {
                this.DE = value;
            }
        }

        public string ThumbImageURLField
        {
            get
            {
                return this.ThumbImageField;
            }
            set
            {
                this.ThumbImageField = value;
            }
        }

        public string TitleField
        {
            get
            {
                return this.titleField;
            }
            set
            {
                this.titleField = value;
            }
        }

        [SPWebCategoryName("General Settings"), WebBrowsable(true), Personalizable(true), WebDisplayName("URL without the slash to your Display Form"), WebDescription("URL")]
        public string URLtoNews
        {
            get
            {
                return this.urltocalendar;
            }
            set
            {
                this.urltocalendar = value;
            }
        }

        public enum AddInsEnum
        {
            HyperLink,
            ImageUploader
        }

        public enum PeriodEnum
        {
            One,
            Two,
            Three,
            Four,
            Five,
            Six,
            Seven,
            Eight,
            Nine,
            Ten
        }

        public enum TheDateFormat
        {
            DayMonthYear,
            MonthDayYear
        }
    }
}
